package com.example.sequence.basicJavaKnowledge;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * @author ：songxusheng
 * @date ：Created in 2022/2/24 9:14
 * @description：了解Stream的方法
 * @version: 0.0.1$
 */
@Slf4j
public class StreamTest {
    /**
     * 通过java.util.Collection.stream()方式创建
     */
    @Test
    public void CreateStream1(){
        //将数组转化成集合
        List<String> list= Arrays.asList("a","b","c");
        //创建一个顺序流
        Stream<String> stream = list.stream();
        stream.forEach(System.out::println);
        //创建一个并行流
        Stream<String> stringStream = list.parallelStream();
        stringStream.forEach(System.out::println);
    }

    /**
     * 通过java.util.Arrays.stream(T[] array)方式创建
     */
    @Test
    public void CreateStream2(){
        //将数组转化成集合
        int[] array={1,2,3,5,6};
        log.error("我是一条日志信息");
        IntStream stream = Arrays.stream(array);
    }

    /**
     * ###### 通过Stream的静态方法：of(),iterate(),generate()方式创建
     */
    @Test
    public void CreateStream3(){
        Stream<Integer> integerStream = Stream.of(1, 4, 3, 8, 6, 7);
        Stream<Integer> limit = Stream.iterate(0, (x) -> x + 3).limit(4);
        limit.forEach(System.out::println);

        Stream<Double> limit1 = Stream.generate(Math::random).limit(3);
        limit1.forEach(System.out::println);
    }

    /**
     * ###### 通过Stream遍历或匹配
     */
    @Test
    public void ergodicOrMatching(){
        List<Integer> list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);

        // 遍历输出符合条件的元素
        list.stream().filter(x -> x > 7).forEach(System.out::println);
        // 匹配第一个
        Optional<Integer> findFirst = list.stream().filter(x -> x > 6).findFirst();
        // 匹配任意（适用于并行流）
        Optional<Integer> findAny = list.parallelStream().filter(x -> x > 6).findAny();
        // 是否包含符合特定条件的元素
        boolean anyMatch = list.stream().anyMatch(x -> x < 6);
        System.out.println("匹配第一个值：" + findFirst.get());
        System.out.println("匹配任意一个值：" + findAny.get());
        System.out.println("是否存在大于6的值：" + anyMatch);
    }

}
